{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-a34a30334354>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.one_hot on tensors.\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\contrib\\learn\\python\\learn\\datasets\\mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。\n",
    "### -1那里表示batchsize的大小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\python\\framework\\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\contrib\\layers\\python\\layers\\layers.py:1624: flatten (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use keras.layers.flatten instead.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-11-413a88f1eb86>:3: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n"
     ]
    }
   ],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-12-3c77ec77605a>:2: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See `tf.nn.softmax_cross_entropy_with_logits_v2`.\n",
      "\n",
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.280129, the validation accuracy is 0.9176\n",
      "after 200 training steps, the loss is 0.141883, the validation accuracy is 0.9582\n",
      "after 300 training steps, the loss is 0.121274, the validation accuracy is 0.9688\n",
      "after 400 training steps, the loss is 0.0862537, the validation accuracy is 0.9776\n",
      "after 500 training steps, the loss is 0.115805, the validation accuracy is 0.979\n",
      "after 600 training steps, the loss is 0.064871, the validation accuracy is 0.9792\n",
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.18028, the validation accuracy is 0.9798\n",
      "after 800 training steps, the loss is 0.170106, the validation accuracy is 0.981\n",
      "after 900 training steps, the loss is 0.0516297, the validation accuracy is 0.9828\n",
      "after 1000 training steps, the loss is 0.0186026, the validation accuracy is 0.981\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9846\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From d:\\programfile\\python\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
